import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core';
import type { Request } from 'supertest';

// 守卫，一般用于验证是否有权限，比如token等
// 可以局部注册，全局注册
@Injectable()
export class RoleGuard implements CanActivate {
  constructor(private reflector: Reflector) {}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    console.log('经过了守卫');
    // 获取接口的SetMetadata设置role值，这里只是模拟接口设置了权限
    const admin = this.reflector.get<string[]>('role', context.getHandler());
    // 一般来说是在这里获取请求头的token，来判断是否有权限请求
    const req = context.switchToHttp().getRequest<Request>();
    // 获取请求参数是否有role参数
    if (admin.includes(req.query['role'] as string)) {
      // 返回true代表通过
      return true;
      // 返回false代码不通过，状态码为403
    } else {
      return false;
    }
  }
}
